/**
 * 2020年7月5日15:55:41
 * 	单链表操作
 * 2020年11月29日15:16:49
 * 	增加获取链表的第几个元素：SingeListGetnodeByNum(type,list,num)
 * 	更改了SingeListGetnode(type,nodehead)宏定义，插入啥类型，这里就填写啥类型，获得的一定是个指针类型，因为链表插入的就是地址
 * 	增加了DEMO，以供参考
*/

#ifndef _SingleList_H_
#define _SingleList_H_

#include "uhead.h"

typedef void SingleListNode;
typedef void listHead;		//	 表头
typedef struct 
{
	listHead* next;
    unsigned int num;				// 链表节点个数
}SingleList;

typedef struct 
{		
	listHead* next;
	SingleListNode* node;	// 顺序不能变

}SingleListNodeStr;

/* 函数*/

SingleList* 		NewSingleList(void);												// 创建新链表
SingleListNodeStr* 	SingleList_InsertEnd(SingleList* list, SingleListNode* node);		// 向链表添加节点
SingleListNodeStr* 	SingleList_InsertBefore(SingleList* list, SingleListNode* objnode, SingleListNode* newnode);// 在节点之前插入新节点,返回新插入的节点地址
SingleListNode* 	SingleList_DeleteNode(SingleList* list, SingleListNode* node);		// 删除节点并释放空间
listHead* 			SingleList_Iterator(listHead** node);								// 迭代器
void 				FreeSingList(SingleList* list);										// 释放链表
void 				SingleList_MoveEndNode(SingleList* list, SingleListNode* node);		// 将节点移到链表末尾
SingleListNode* 	SingleList_GetNode(SingleList* list,unsigned int num);				// 获得LIST的第几个节点, num 是从0开始的下标


#define		SingeListGetnode(type,nodehead)				((type)(((SingleListNodeStr*)nodehead)->node))			// type应该是指针类型，因为插入的都是指针类型			
#define		SingeListGetnodeByNum(type,list,num)		((type)(((SingleListNodeStr*)SingleList_GetNode(list, num))->node))	// 返回链表的第几个元素的地址


// 遍历输出单链表所有的节点,根据需要修改里面的类型
void ShowSingleList(SingleList* list);



#endif
